
/**
 * 
 * 手机App防沉迷系统
 * 
 * 题目描述

智能手机方便了我们生活的同时，也侵占了我们不少的时间。

“手机App防沉迷系统”能够让我们每天合理地规划手机App使用时间，在正确的时间做正确的事。

它的大概原理是这样的：

在一天24小时内，可以注册每个App的允许使用时段
一个时间段只能使用一个App，举例说明：不能同时在9:00-10:00注册App2和App3
App有优先级，数值越高，优先级越高。注册使用时段时，如果高优先级的App时间和低优先级的时段有冲突，
则系统会自动注销低优先级的时段，如果App的优先级相同，则后添加的App不能注册。

举例1：
(1) 注册App3前


(2) App3注册时段和App2有冲突


(3) App3优先级高，系统接受App3的注册，自动注销App2的注册



举例2：
(1) 注册App4


(2) App4和App2及App3都有冲突，优先级比App2高，但比App3低，这种场景下App4注册不上，最终的注册效果如下

一个App可以在一天内注册多个时段

请编程实现，根据输入数据注册App，并根据输入的时间点，返回时间点使用的App名称，如果该时间点没有注册任何App，请返回字符串“NA”。

输入描述
输入分3部分：

第一行表示注册的App数量 N（N ≤ 100）
第二部分包括 N 行，每行表示一条App注册数据
最后一行输入一个时间点，程序即返回该时间点使用的App
2
App1 1 09:00 10:00
App2 2 11:00 11:30
09:30
数据说明如下：

N行注册数据以空格分隔，四项数依次表示：App名称、优先级、起始时间、结束时间
优先级1~5，数字越大，优先级越高
时间格式 HH:MM，小时和分钟都是两位，不足两位前面补0
起始时间需小于结束时间，否则注册不上
注册信息中的时间段包含起始时间点，不包含结束时间点
输出描述
输出一个字符串，表示App名称，或NA表示空闲时间

备注
用例保证时间都介于 00:00 - 24:00 之间；
用例保证数据格式都是正确的，不用考虑数据输入行数不够、注册信息不完整、字符串非法、优先级超限、时间格式不正确的问题；

 */

 /**
  * 
  用例
  输入	1
App1 1 09:00 10:00
09:30
输出	App1
说明	App1注册在9点到10点间，9点半可用的应用名是App1
输入	2
App1 1 09:00 10:00
App2 2 09:10 09:30
09:20
输出	App2
说明	App1和App2的时段有冲突，App2优先级比App1高，注册App2后，系统将App1的注册信息自动注销后，09:20时刻可用应用名是App2
输入	2
App1 1 09:00 10:00
App2 2 09:10 09:30
09:50
输出	NA
说明	App1被注销后，09:50时刻没有应用注册，因此输出NA
  */

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
   * 
   * 题目解析
   * 
   * 注册时段是否有冲突？
如果没有冲突，则继续和下一个App_registered比较
如果有冲突，则比较优先级

2.1. App_registering 的优先级高于（>）App_registered，则App_registered需要被注销，此时不能直接进行注销动作，因为我们需要确保 App_registering 可以注册后，才能进行注销。

2.2. App_registering 的优先级不高于（≤）App_registered，则App_registering不能注册，即终止后续比较

本题比较两个App注册时段冲突



   */

public class 手机App防沉迷系统 {
    

    private static List<AppInfoBean> appRegisterInfos = new ArrayList<AppInfoBean>();

    public static void main(String[] args){

        try{

            Scanner scanner = new Scanner(System.in);
            int appCount = scanner.nextInt();

            for(int i=0; i< appCount; i++){

                appRegisterInfos.add(new AppInfoBean(scanner.next(), scanner.nextInt(), parseTime(scanner.next()), parseTime(scanner.next())));

            }

            int pointTime = parseTime(scanner.next());


            List<AppInfoBean> registeredApp = new ArrayList<>();

            //根据优先级排序，优先级高的在前面显示

            appRegisterInfos.sort((a, b) -> b.priority - a.priority);

            //判断注册信息是否可以注册
            for(AppInfoBean app : appRegisterInfos){

                if(app.startTime >= app.endTime) continue;

                canAdd(app, registeredApp);
            }


            String ans = "NA";
 
            for (AppInfoBean app : registeredApp) {
            if (pointTime >= app.startTime && pointTime < app.endTime) {
                ans = app.name;
                // 注册成功的App时段之间互不冲突，因此queryTime只会对应一个App
                break;
            }
        }

        System.out.println(ans);


        }catch(Exception e){

            e.printStackTrace();
        }

    }

    private static void canAdd(AppInfoBean app, List<AppInfoBean> registered){

        if(registered.isEmpty()){
            registered.add(app);
        } else{

            //需要判断是否冲突
            for(AppInfoBean rApp: registered){

                //满足无交集的操作，
                if (app.startTime >= rApp.endTime
                 || rApp.startTime >= app.endTime) {
                    registered.add(app);
                }

            }

        }

    }

    public static class AppInfoBean {


        String name;
        int priority;
        int startTime;
        int endTime;

        public AppInfoBean(String name, int priority, int startTime, int endTime){

            this.name = name;
            this.priority = priority;
            this.startTime = startTime;
            this.endTime = endTime;
        }

        
    }

    private static int parseTime(String time){

        try{

            String[] timeArr = time.split(":");
            String hour = timeArr[0];
            String min = timeArr[1];

            return Integer.parseInt(hour)*60 + Integer.parseInt(min);

        }catch(Exception e){
            e.printStackTrace();
        }

        return 0;
    }

}
